跳到主要内容

openssl 命令

OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。

OpenSSL 整个软件包大概可以分成三个主要的功能部分:密码算法库、SSL协议库以及应用程序。

随机数

openssl rand -out rand.dat -base64 32

生成的 rand.dat 文件

76w1VjaUlnDq5mvUheFnGCVtmKklRdOW2nOcNGF5oH4=

密钥操作

RSA

openssl genrsa -out rsa.key 2048(私钥不带密码)

openssl genrsa -out rsa.key -aes256 -passout pass:123456 2048(私钥带密码)

ecparam

openssl ecparam -name CN-GM-ECC -out sm2.param

openssl ecparam -in sm2.param -out sm2.key -genkey -noout

genpkey

openssl genpkey -algorithm RSA -out rsa.key -pkeyopt rsa_keygen_bits:2048

openssl genpkey -parafile sm2.param -out sm2.key

不带密码的私钥==>带密码的私钥

openssl rsa -in rsa.key -out xxx.key -aes256 -passout pass:123456

openssl ec -in sm2.key -out xxx.key -sm4 -passout pass:123456

带密码的私钥==>不带密码的私钥

openssl rsa -in xxx.key -passin pass:123456 -out yyy.key

openssl ec -in xxx.key -passin pass:123456 -out yyy.key

pkey加解密私钥

openssl pkey -in rsa.key -out rsa_enc.key -des3 -passout pass:1234

openssl pkey -in rsa_enc.key -out rsa.key -passin pass:1234

从密钥对提取公钥

openssl rsa -in chen.key -pubout -out chen_pub.key

私钥公钥的使用

产生 1024 位 RSA 私匙,用 3DES 加密它,口令为 trousers,输出到文件 rsaprivatekey.pem

openssl genrsa -out rsaprivatekey.pem -passout pass:trousers -des3 1024

从文件 rsaprivatekey.pem 读取私匙,用口令 trousers 解密,生成的公钥匙输出到文件 rsapublickey.pem

openssl rsa -in rsaprivatekey.pem -passin pass:trousers -pubout -out rsapubckey.pem

用公钥匙 rsapublickey.pem 加密文件 plain.txt,输出到文件 cipher.txt

openssl rsautl -encrypt -pubin -inkey rsapublickey.pem -in plain.txt -out cipher.txt

使用私钥匙 rsaprivatekey.pem 解密密文 cipher.txt,输出到文件 plain.txt

openssl rsautl -decrypt -inkey rsaprivatekey.pem -in cipher.txt -out plain.txt

用私钥匙 rsaprivatekey.pem 给文件 plain.txt 签名,输出到文件 signature.bin

openssl rsautl -sign -inkey rsaprivatekey.pem -in plain.txt -out signature.bin

用公钥匙 rsapublickey.pem 验证签名 signature.bin,输出到文件 plain.txt

openssl rsautl -verify -pubin -inkey rsapublickey.pem -in signature.bin -out plain

证书的使用 ⭐

从 X.509 证书文件 cert.pem 中获取公钥匙,用 3DES 加密 mail.txt,输出到文件 mail.enc

openssl smime -encrypt -in mail.txt -des3 -out mail.enc cert.pem

从 X.509证书文件 cert.pem 中获取接收人的公钥匙,用私钥匙 key.pem 解密 S/MIME 消息 mail.enc,结果输出到文件 mail.txt

openssl smime -decrypt -in mail.enc -recip cert.pem -inkey key.pem -out mail.txt

cert.pem 为 X.509 证书文件,用私匙 key.pem 为 mail.txt 签名,证书被包含在 S/MIME 消息中,输出到文件 mail.sgn

openssl smime -sign -in mail.txt -signer cert.pem -inkey key.pem -out mail.sgn

验证 S/MIME 消息 mail.sgn,输出到文件 mail.txt,签名者的证书应该作为 S/MIME 消息的一部分包含在 mail.sgn 中

openssl smime -verify -in mail.sgn -out mail.txt

摘要算法

摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。

举个例子,你写了一篇文章,内容是一个字符串 'how to use pythonhashlib - by Michael',并附上这篇文章的摘要是 '2d73d4f15c0db7f5ecb321b6a65e5d6d'

如果有人篡改了你的文章,并发表为 'how to usepython hashlib - by Bob',你可以一下子指出 Bob 篡改了你的文章,因为根据 'how to usepython hashlib - by Bob' 计算出的摘要不同于原始文章的摘要。

摘要算法之所以能指出数据是否被篡改过,就是因为摘要函数是一个单向函数,计算f(data)很容易,但通过 digest 反推 data 却非常困难。而且,对原始数据做一个bit的修改,都会导致计算出的摘要完全不同。

摘要算法 主要有 SHA-1、MD5 等。

直接做摘要

plain.txt 文件做摘要

openssl dgst -sha1 -out dgst.dat plain.txt

对摘要进行签名/验签

先做摘要,然后对摘要进行签名/验签,下面的 priv.keypub.key 分别是私钥和公钥

签名摘要

openssl dgst -sha1 -sign priv.key -out sig.dat plain.txt

验签摘要

openssl dgst -sha1 -verify pub.key -signature sig.dat plain.txt

对称加密

块密码算法也叫分组密码算法,从字面意思就可以知道,它把加密和解密序列分成了一个个分组,最后把每一块序列合并到一起,形成明文或者密文。根据不同的分组加密方式,每个分组之间可以有联系,也可以没有联系

流密码算法,或者叫序列密码,算法大概的原理是,每次加密都通过密钥生成一个密钥流,解密也是使用同一个密钥流,明文与同样长度的密钥流进行异或运算得到密文,密文与同样的密钥流进行异或运算得到明文。

块密码和流密码是使用对称加密算法加密数据的两种独立方法:

  • 分块加密信息:分组密码将明文消息分解为固定大小的块,然后使用密钥将其转换为密文。
  • 逐位加密信息:另一方面,流密码将明文消息分解为单个位,然后使用密钥位将其分别转换为密文。

块加密

加密

openssl enc -sm4 -K "0123456789abcdeffedcba9876543210" -iv "12345678123456781234567812345678" -e -in plain.txt -out encrypted.dat

解密

openssl enc -sm4 -K "0123456789abcdeffedcba9876543210" -iv "12345678123456781234567812345678" -d -in encrypted.dat -out decrypted.dat

流加密

加密

openssl enc -rc4 -a -K 0000000000000000 -in plain.dat -out encrypted.dat

解密

openssl enc -d -rc4 -a -K 0000000000000000 -in encrypted.dat -out decrypted.dat

非对称加密

签名

openssl pkeyutl -sign -inkey rsa.key -in rsa.dat -out sign.dat

验签

openssl pkeyutl -verify -certin -inkey rsa.pem -in rsa.dat -sigfile sign.dat

openssl pkeyutl -verify -inkey rsa.key -in rsa.dat -sigfile sign.dat

加密

openssl pkeyutl -encrypt -inkey rsa.key -in rsa.dat -out enc.dat

解密

openssl pkeyutl -decrypt -inkey rsa.key -in enc.dat -out source.dat

证书请求

生成证书请求

需要手动输入一些证书项,如 CN,email 等

# 先使用 RSA 算法生成私钥
openssl genrsa -out mysite.key 2048

# 生成证书请求
openssl req -key mysite.key -new -out mysite.req -sha1 -utf8

# 私钥带密码的情况
openssl req -key mysite.key -passin pass:123456 -new -out mysite.req -sha1 -utf8

这个 req 是 X.509证书签发请求

提示

X.509 是用于的标准格式 公钥证书,是将加密密钥对与网站,个人或组织等身份安全地关联的数字文档。

自定义信息

-----
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:XxXx
Locality Name (eg, city) []:XxXx
Organization Name (eg, company) [Internet Widgits Pty Ltd]:XX Co. Ltd
Organizational Unit Name (eg, section) []:Dev
Common Name (e.g. server FQDN or YOUR name) []:server name
Email Address []:xxx@xxx.com

验证请求

openssl req -verify -in mysite.req -noout

解析请求

openssl req -in mysite.req -text

签发证书

CA根证书

openssl x509 -req -days 3650 -in rootca.req -signkey rootca.key -out rootca.pem -passin pass:xxxx(私钥带密码的情况) -CAcreateserial

用户证书

openssl x509 -req -in user.req -CA rootca.pem -CAkey rootca.key -out user.pem -passin pass:12345678 v3_req -CAcreateserial -days 3650

References